package AccesoADatos;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import Logica.Entidades.Jugador;
import Logica.Entidades.Partido;

public class PartidoDAO {
	
	public List<List<String>> obtenerPartidos(int nroFecha){
		List<List<String>> jugadoresDto = new ArrayList<List<String>>();
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			String consulta = "SELECT * FROM PARTIDO WHERE NRO_FECHA = " + nroFecha;
			
			Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(consulta);
			
			jugadoresDto = resultSetToString(rset,9);
			
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return jugadoresDto;
	}
	
	public List<List<String>> resultSetToString(ResultSet r, int columnas) throws SQLException{
		
		List<List<String>> lista = new ArrayList<List<String>>();
		
		while(r.next()){
			
			List<String> temp = new ArrayList<String>();
			
			for(int i = 1 ; i < columnas ; i++){
				temp.add(r.getString(i));
			}
			lista.add(temp);
		}
		return lista;
	}
	
	public List<List<String>> getGolesRecibidosPorElEquipo(int idJugador, int nroFecha, int idEquipo) {
		List<List<String>> golesRecibidosPorElEquipoDto = new ArrayList<List<String>>();
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			
			String consulta = "(SELECT P.GOLES_EQUIPO2 FROM PARTIDO P, JUGADOR J, EQUIPOPRIMERA EQ, FECHA F WHERE EQ.ID_EQUIPO = " + idEquipo + " AND EQ.ID_EQUIPO = P.ID_EQUIPO1 AND EQ.ID_EQUIPO = J.ID_EQUIPO_PRIMERA AND F.NRO_FECHA = P.NRO_FECHA AND F.NRO_FECHA = " + nroFecha + ") UNION (SELECT P.GOLES_EQUIPO1 FROM PARTIDO P, JUGADOR J, EQUIPOPRIMERA EQ, FECHA F WHERE EQ.ID_EQUIPO = " + idEquipo + " AND EQ.ID_EQUIPO = P.ID_EQUIPO2 AND EQ.ID_EQUIPO = J.ID_EQUIPO_PRIMERA AND F.NRO_FECHA = P.NRO_FECHA AND F.NRO_FECHA = " + nroFecha + ")";
			
			Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(consulta);
			
            golesRecibidosPorElEquipoDto = resultSetToString(rset,2);
			
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return golesRecibidosPorElEquipoDto;
	}

	public List<List<String>> getFiguraPartido(Partido partido, int nFecha) {
		List<List<String>> jugadorFiguraDto = new ArrayList<List<String>>();
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			
			String consulta = "(SELECT * FROM JUGADOR J WHERE j.id_equipo_primera = "+partido.getEquipo1().getIdEquipo()+ " AND EXISTS (SELECT * FROM  PUNTAJE_JUGADOR_EN_FECHA PJF WHERE J.ID_JUGADOR = pjf.id_jugador AND pjf.es_figura = 1 AND pjf.nro_fecha = "+ nFecha +")) UNION (SELECT * FROM JUGADOR J WHERE j.id_equipo_primera = "+ partido.getEquipo2().getIdEquipo() +" AND EXISTS (SELECT * FROM  PUNTAJE_JUGADOR_EN_FECHA PJF WHERE J.ID_JUGADOR = pjf.id_jugador AND pjf.es_figura = 1 AND pjf.nro_fecha = "+ nFecha +"))";
			
			Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(consulta);
			
            jugadorFiguraDto = resultSetToString(rset,8);
			
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return jugadorFiguraDto;
	}

	public void guardarPartido(Partido partido) {
		String consulta = "UPDATE PARTIDO SET ESTADO="+partido.getEstado()+",GOLES_EQUIPO1="+partido.getGolesEquipo1()+",GOLES_EQUIPO2="+partido.getGolesEquipo2()+",ESTADOJUGADO='"+partido.getEstadoJugado()+"' WHERE NRO_PARTIDO = "+partido.getNroPartido();
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			Statement stmt = conn.createStatement();
            stmt.executeQuery(consulta);
			
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}

	public List<List<String>> getSumaDeGolesRecibidos(int nroFecha, int idEquipo) {
		List<List<String>> sumaDeGolesRecibidosDto = new ArrayList<List<String>>();
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			
			String consulta = "SELECT SUM(P.GOLES_RECIBIDOS) FROM EQUIPOPRIMERA E, JUGADOR J, PUNTAJE_JUGADOR_EN_FECHA P WHERE E.ID_EQUIPO = " + idEquipo + " AND P.NRO_FECHA = " + nroFecha + " AND J.ID_EQUIPO_PRIMERA = E.ID_EQUIPO AND J.ID_JUGADOR = P.ID_JUGADOR";
			
			Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(consulta);
			
            sumaDeGolesRecibidosDto = resultSetToString(rset,2);
			
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return sumaDeGolesRecibidosDto;
	}

	public List<List<String>> getSumaDeGolesYPenalesConvertidos(int nroFecha, int idEquipo) {
		List<List<String>> sumaDeGolesYPenalesConvertidosDto = new ArrayList<List<String>>();
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			
			String consulta = "SELECT SUM(P.GOLES_CONVERTIDOS), SUM(P.PENALES_CONVERTIDOS) FROM EQUIPOPRIMERA E, JUGADOR J, PUNTAJE_JUGADOR_EN_FECHA P WHERE E.ID_EQUIPO = " + idEquipo + " AND P.NRO_FECHA = " + nroFecha + " AND J.ID_EQUIPO_PRIMERA = E.ID_EQUIPO AND J.ID_JUGADOR = P.ID_JUGADOR";
			
			Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(consulta);
			
            sumaDeGolesYPenalesConvertidosDto = resultSetToString(rset,3);
			
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return sumaDeGolesYPenalesConvertidosDto;
	}
	
	public List<List<String>> getSumaDeGolesEnContra(int nroFecha, int idEquipo) {
		List<List<String>> sumaDeGolesEnContraDto = new ArrayList<List<String>>();
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			
			String consulta = "SELECT SUM(P.GOLES_EN_CONTRA) FROM EQUIPOPRIMERA E, JUGADOR J, PUNTAJE_JUGADOR_EN_FECHA P WHERE E.ID_EQUIPO = " + idEquipo + " AND P.NRO_FECHA = " + nroFecha + " AND J.ID_EQUIPO_PRIMERA = E.ID_EQUIPO AND J.ID_JUGADOR = P.ID_JUGADOR";
			
			Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(consulta);
			
            sumaDeGolesEnContraDto = resultSetToString(rset,2);
			
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return sumaDeGolesEnContraDto;
	}

	public List<List<String>> getSumaDeGolesRecibidosJugador(int nroFecha, int idEquipo, int idJugador) {
		List<List<String>> sumaDeGolesRecibidosDto = new ArrayList<List<String>>();
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			
			String consulta = "SELECT SUM(P.GOLES_RECIBIDOS) FROM EQUIPOPRIMERA E, JUGADOR J, PUNTAJE_JUGADOR_EN_FECHA P WHERE J.ID_JUGADOR = " + idJugador + " AND E.ID_EQUIPO = " + idEquipo + " AND P.NRO_FECHA = " + nroFecha + " AND J.ID_EQUIPO_PRIMERA = E.ID_EQUIPO AND J.ID_JUGADOR = P.ID_JUGADOR";
			
			Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(consulta);
			
            sumaDeGolesRecibidosDto = resultSetToString(rset,2);
			
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return sumaDeGolesRecibidosDto;
	}

	public List<List<String>> getSumaDeGolesYPenalesConvertidosJugador(int nroFecha, int idEquipo, int idJugador) {
			List<List<String>> sumaDeGolesYPenalesConvertidosDto = new ArrayList<List<String>>();
			try {
				Connection conn = ConexionOracle.getConexionOracle().getConnection();
				
				String consulta = "SELECT SUM(P.GOLES_CONVERTIDOS), SUM(P.PENALES_CONVERTIDOS) FROM EQUIPOPRIMERA E, JUGADOR J, PUNTAJE_JUGADOR_EN_FECHA P WHERE J.ID_JUGADOR = " + idJugador + " AND E.ID_EQUIPO = " + idEquipo + " AND P.NRO_FECHA = " + nroFecha + " AND J.ID_EQUIPO_PRIMERA = E.ID_EQUIPO AND J.ID_JUGADOR = P.ID_JUGADOR";
				
				Statement stmt = conn.createStatement();
	            ResultSet rset = stmt.executeQuery(consulta);
				
	            sumaDeGolesYPenalesConvertidosDto = resultSetToString(rset,3);
				
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			return sumaDeGolesYPenalesConvertidosDto;
	}

	public List<List<String>> getSumaDeGolesEnContraJugador(int nroFecha, int idEquipo, int idJugador) {
		List<List<String>> sumaDeGolesEnContraDto = new ArrayList<List<String>>();
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			
			String consulta = "SELECT SUM(P.GOLES_EN_CONTRA) FROM EQUIPOPRIMERA E, JUGADOR J, PUNTAJE_JUGADOR_EN_FECHA P WHERE J.ID_JUGADOR = " + idJugador + " AND E.ID_EQUIPO = " + idEquipo + " AND P.NRO_FECHA = " + nroFecha + " AND J.ID_EQUIPO_PRIMERA = E.ID_EQUIPO AND J.ID_JUGADOR = P.ID_JUGADOR";
			
			Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(consulta);
			
            sumaDeGolesEnContraDto = resultSetToString(rset,2);
			
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return sumaDeGolesEnContraDto;
	}

	public List<List<String>> verificarFigura(int idEquipo, int nroFecha) {
		List<List<String>> figuraDto = new ArrayList<List<String>>();
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			
			String consulta = "(SELECT MAX(PJ.ES_FIGURA) FROM PARTIDO P, PUNTAJE_JUGADOR_EN_FECHA PJ, JUGADOR J WHERE P.NRO_FECHA = " + nroFecha + " AND P.NRO_FECHA = PJ.NRO_FECHA AND P.ID_EQUIPO1 = " + idEquipo + " AND P.ID_EQUIPO1 = J.ID_EQUIPO_PRIMERA AND PJ.ID_JUGADOR = J.ID_JUGADOR) UNION (SELECT MAX(PJ.ES_FIGURA) FROM PARTIDO P, PUNTAJE_JUGADOR_EN_FECHA PJ, JUGADOR J WHERE P.NRO_FECHA = " + nroFecha + " AND P.NRO_FECHA = PJ.NRO_FECHA AND P.ID_EQUIPO2 = " + idEquipo + " AND P.ID_EQUIPO2 = J.ID_EQUIPO_PRIMERA AND PJ.ID_JUGADOR = J.ID_JUGADOR)";
			
			Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(consulta);
			
            figuraDto = resultSetToString(rset,2);
			
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return figuraDto;
	}

	public List<List<String>> obtenerIdJugadoresPuntajes(int idEquipo, int nroFecha) {
		List<List<String>> idJugadorDto = new ArrayList<List<String>>();
		try {
			Connection conn = ConexionOracle.getConexionOracle().getConnection();
			
			String consulta = "(SELECT J.ID_JUGADOR FROM PUNTAJE_JUGADOR_EN_FECHA PJ, PARTIDO P, JUGADOR J WHERE P.NRO_FECHA = " + nroFecha + " AND J.ID_EQUIPO_PRIMERA = " + idEquipo + " AND P.NRO_FECHA = PJ.NRO_FECHA AND PJ.ID_JUGADOR = J.ID_JUGADOR AND P.ID_EQUIPO1 = J.ID_EQUIPO_PRIMERA) UNION (SELECT J.ID_JUGADOR FROM PUNTAJE_JUGADOR_EN_FECHA PJ, PARTIDO P, JUGADOR J WHERE P.NRO_FECHA = " + nroFecha + " AND J.ID_EQUIPO_PRIMERA = " + idEquipo + " AND P.NRO_FECHA = PJ.NRO_FECHA AND PJ.ID_JUGADOR = J.ID_JUGADOR AND P.ID_EQUIPO2 = J.ID_EQUIPO_PRIMERA)";
			
			Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(consulta);
			
            idJugadorDto = resultSetToString(rset,2);
			
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return idJugadorDto;
	}
}